package com.pmcc.cj.web;

import com.pmcc.cj.entity.*;
import com.pmcc.cj.service.*;
import com.pmcc.cj.vo.CertificationVo;
import com.pmcc.core.service.DictService;
import com.pmcc.core.service.EmployeeService;
import com.pmcc.utils.AntdPage;
import com.pmcc.utils.ResultBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mobile.device.Device;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;


/**
 * Created by yaonan on 2018/3/26.
 */
@RestController()
@RequestMapping("api/v1/app")
public class AppController {

    @Autowired
    AppService appService;
    @Autowired
    CjWechatService wechatService;
    @Autowired
    CjCommodityYunService cjCommodityYunService;
    @Autowired
    CjTrainService cjTrainService;
    @Autowired
    CjTrainDetailService cjTrainDetailService;
    @Autowired
    DictService dictService;
    @Autowired
    CjOrderService cjOrderService;
    @Autowired
    EmployeeService employeeService;
    @Autowired
    CjAreaAgencyService areaAgencyService;
    @Autowired
    FileService fileService;
    @Autowired
    CjRobotAttestService cjRobotAttestService;
    @Autowired
    CjTaskService cjTaskService;
    @Autowired
    CjOrderIndexService cjOrderIndexService;
    @Autowired
    CjEvaluationService cjEvaluationService;


    //-----------------------------------------------------用户信息-----------------------------------------------------
    /**
     *用户登录
     * @param code 微信客户端获取的code
     * @return 返回 resultBean  登录成功，无此用户（直接调用注册命令），服务器异常，该用户被禁用
     */
    @PostMapping(value= "login")
    public ResultBean wechatLogin(String code, Device device){
        return appService.wechatLogin(code,device);
    }
    /**
     * 获取登录人信息
     * @param type app 用于区分web端的
     * @return
     */
    @GetMapping(value = "getEmployeeInfo")
    public ResultBean getEmployeeInfo(String type){
        return employeeService.getEmployeeInfo(type);
    }
    /**
     * 根据用户id获取用户地址信息   用于app用户
     * @param customerId 用户id  (如果不传的话查询当前登录人信息)
     * @return 用户姓名，详细地址，手机号
     */
    @GetMapping("getCustomer")
    public ResultBean getCustomer(String customerId){
        return appService.getCustomer(customerId);
    }

    /**
     * 获取验证码
     * @param cellphone 手机号
     * @return
     */
    @GetMapping(value = "cellphoneCode")
    public ResultBean cellphoneCode(String cellphone){
        return employeeService.cellphoneCode(cellphone);
    }



    //--------------------------------------------轮播图---------------------------------------------------------------

    /**
     * 获取轮播图地址
     * 用户登录后，获取用户的首页的轮播图地址
     * @param carouselType /商城页/飞防页    carouselType  '0':首页  '1':商城页  '2':飞防页
     * @return  返回 resultBean  list 集合,集合内存放轮播图的地址，按照顺序排列，轮播图信息的id
     */
    @GetMapping("getCarousel")
    public ResultBean getCarousel(Integer carouselType){
        return appService.getCarousel(carouselType);
    }

    /**
     *获取轮播图详情
     * @param id 轮播图id
     * @renturn 返回广告页详细内容，可以以对象返回，包含由内容的富文本，标题，时间等信息
     */
    @GetMapping("getCarouselDetail")
    public ResultBean getCarouselDetail(String id){
        return appService.getCarouselDetail(id);
    }



    //-------------------------------------------云飞防商品已经购物车--------------------------------------------------


    /**
     * 查询云飞防商品名称
     * @param dictId    作物字典值（如小麦的字典值）
     * @return
     */
    @GetMapping("getCropName")
    public ResultBean getCropName(String dictId){
        return cjCommodityYunService.getCropName(dictId);
    }

    /**
     * 云飞防获取商品列表
     * @param  productId（如玉米，大豆）productId：为对应的字典值id
     * @param  typeId（如飞防杀菌，飞防除草，飞防套餐）typeId：为对应的字典值id
     * @return  商品缩略图，商品id，商品规格和单价【20ml,3,使用说明】[30ml,4，使用说明][40ml,5,使用说明],商品作业简介 ,界面是否组合优惠
     *
     */
    @GetMapping(value= "queryCommodityYun")
    public ResultBean queryCommodityYun(String productId,String typeId){
        return cjCommodityYunService.queryCommodityYun(productId, typeId);
    }

    /**
     * 云飞防点击首页图片显示详情或者云飞防页面点击
     * @param id 主表id
     * @param type 云商城或者云飞防
     * @return
     */
    @GetMapping(value="getCommodityDetail")
    public ResultBean getCommodityDetail(String id,String type){
        return cjCommodityYunService.getCommodityDetail(id, type);
    }

    /**
     * 根据code查询
     * @param code  SPFL:用于查询小麦、玉米、花生等
     *              GNFL：用于查询杀虫、杀菌、除草等
     * @return
     */
    @GetMapping("queryDictByCode")
    public ResultBean queryDictByCode(String code) {
        return dictService.queryDictByCode(code);
    }

    /**
     * 根据当前登录人查询购物车
     * @return
     */
    @GetMapping("findShopping")
    public ResultBean findShopping(){
        return appService.findShopping();
    }

    /**
     * 云商城加入购物车功能接口
     * @param model 对象
     *  用户id  employeeId
     * 商品id  commodityId
     * 商品数量  number
     *  商品单价  money
     *  商品类型（云商城） fettle（0：云商城    1：云飞防）
     * @return 是否添加成功
     */
    @PostMapping("addShopping")
    public ResultBean addShopping(@RequestBody CjShoppingCart model){
        return appService.addShopping(model);
    }

    /**
     * 云商城获取商品列表
     * @param model 农药/种子/化肥/植保无人机
     * @param antdPage pageSize 条数 10
     * @param antdPage defaultCurrent   第几页 1
     * @return 商品的集合 ，包含商品的缩略图，简介，售价等相关信息
     */
//    @GetMapping(value= "queryCommodityByPage")
//    public ResultBean queryCommodityByPage(CjCommodity model, AntdPage antdPage){
//        return appService.queryCommodityByPage(model, antdPage);
//    }

    /**
     * 删除购物车
     * @param id    购物车id
     * @return
     */
    @GetMapping("deleteShoppingCart")
    public ResultBean deleteShoppingCart(String id){
        return appService.deleteShoppingCart(id);
    }

    //-----------------------------------------------位置信息记录------------------------------------------------------

    /**
     * 百度地图的经纬度坐标更新用户当前的经纬度位置信息
     * 用户进入首页，平台会提示获取位置信息，获取到位置信息，将此信息更新到个人位置信息里面，个人位置信息最好新建立一个表，每个人的位置信息保留20条记录
     * 超过20条记录，删除之前的记录，mysql数据库最多留存20条          做成定时任务，每天更新一次，不用每次新增的时候删除（tomas）
     * @param model
     * 用户id      customerId
     *  经度坐标      xx
     *  纬度坐标      yy
     *  精度（代表获取位置的精度，数值类型）    positionHeight
     *  高度 （海拔高度，数值类型）    highness
     *  国家    country
     *  省份    province
     *  城市    city
     *  区县    county
     *  城镇 （一般都是什么街道，或者乡镇）    town
     *  街道   street
     *  位置描述  （地图会告诉你，在什么附近）  positionDesc
     * @return 返回是否保存成功（这个目前没什么用）
     */
    @PostMapping(value= "addPosition")
    public ResultBean addPosition(@RequestBody CjPosition model){
        return appService.addPosition(model);
    }



    //-------------------------------------------各种认证-------------------------------------------------------------

    /**
     * 种地大户认证
     * @param id 用户id
     * @param code 种地大户激活码
     * @param cardId 身份证号
     * @param cardImage1 身份证正面
     * @param cardImage2 身份证反面
     * @return ResultBean
     */
    @GetMapping("verificationFarm")
    public ResultBean verificationFarm(String id,String code,String cardId,String cardImage1,String cardImage2){
        return appService.verificationFarm(id,code,cardId,cardImage1,cardImage2);
    }
    /**
     * 种地大户激活码认证
     * 验证激活码是否有效
     * @param code 激活码
     * @renturn RestltBean
     */
    @GetMapping("verificationFarmCode")
    public ResultBean verificationFarmCode(String code){
        return appService.verificationFarmCode(code);
    }

    /**
     * 种地大户查询是否有认证记录
     */
    @GetMapping("getFarm")
    public ResultBean getFarm(String id){
        return appService.getFarm(id);
    }

    /**
     * 身份认证
     * @param id    用户id
     * @param cellphone 电话
     * @param code  验证码
     * @param p1 省
     * @param p2 市
     * @param p3 县
     * @param p4 乡
     * @param p5 村
     * @param p6 详细地址
     * @return
     */
    @GetMapping("updateCustomerByCellphone")
    public ResultBean updateCustomerByCellphone(String id,String cellphone,String code,String p1,String p2,String p3,String p4,String p5,String p6){
        return appService.updateCustomerByCellphone(id,cellphone,code,p1,p2,p3,p4,p5,p6);
    }

    /**
     * 零售商认证初次校验    5省市县乡村
     * 用户填完零售商的激活码则返回激活码是否有效(传参是激活码，返回是否有效)
     *  type    0:零售商认证   1：县级代理认证
     */
    @GetMapping("verificationCode")
    public ResultBean verificationCode(String code,String type){
        return appService.verificationCode(code,type);
    }

    /**
     * 县级代理商认证填写表单
     * 入参：激活码，店铺名称，姓名，身份证号，身份证正面照片，身份证反面照片，营业执照照片，农药销售许可证，门头照片，店铺详细地址（根据激活码自动匹配省市县）可以补充一个更详细的地址如门牌号，地址的经度坐标，纬度坐标（由手机获取后上传）
     *
     *
     * 店铺详细地址（根据激活码自动匹配省市县）可以补充一个更详细的地址如门牌号——>这个由前台拼接，verificationCode这个接口返回值和输入内容拼接
     *
     *
     * 返回：提交成功或者失败
     * 提交之后在web端查看，然后审核
     * 认证表里的业务员id（employee），是有web页面配置的，需要重新建一个表。激活码、id、时间、使用时间、是否使用
     *
     */
    @PostMapping("certificationCustomer")
    public ResultBean certificationCustomer(@RequestBody CertificationVo certificationVo){
        return appService.certificationCustomer(certificationVo);
    }

    /**
     * 判断当前登录人是否已经做过零售商认证
     * @return
     */
    @GetMapping("getRetailer")
    public ResultBean getRetailer(){
        return appService.getRetailer();
    }

    /**
     * 判断当前登录人是否已经做过县级代理认证
     * @return
     */
    @GetMapping("getCountyProxy")
    public ResultBean getCountyProxy(){
        return appService.getCountyProxy();
    }
    /**
     * 查询省市县乡村
     * @param parentId 父级ID 省的必须传入root
     */
    @GetMapping("queryArea")
    public ResultBean queryArea(String parentId){
        return areaAgencyService.queryArea(parentId);
    }

    /**
     * 新增机手认证
     * @param model 需要传递name、positiveCard、backCard、robotCard、robotDesc、insurance
     * @return
     */
    @PostMapping("robotApprove")
    public ResultBean robotApprove(@RequestBody CjRobotAttest model){
        return cjRobotAttestService.robotApprove(model);
    }

    /**
     * 更新机手推送状态
     * @param robotFlag 0：推送    1：不推送       必须传，不能为空
     * @return
     */
    @GetMapping("robotFlagChange")
    public ResultBean robotFlagChange(String robotFlag){
        return cjRobotAttestService.robotFlagChange(robotFlag);
    }

    /**
     * 机手认证查询
     * @return
     */
    @GetMapping("getRobot")
    public ResultBean getRobot(){
        return cjRobotAttestService.getRobot();
    }





    //-----------------------------------------------微信支付接口-------------------------------------------------------

    /**
     * 微信支付统一下单接口
     * @param userId 携带信息
     * @param totalFee
     * @param description 商品描述
     *             {'allmoney':160,yunDetail:{
     *
     *             ['totalmoney':80.00,genre:1(1代表飞防，0代表商城),isSaleRule:0(0代表未使用满减,1代表使用满减),isNormal:0 (0标准，1非标准规格),shopId:'',
     *      *             yun:id(传入套餐id),yunPrice:10(套餐单价),yunNum:8(套餐亩数),detail:{['id':'商品id','dose':'规格','name':'商品名称']}],
     *             ['totalmoney':80.00,genre:1(1代表飞防，0代表商城),isSaleRule:0(0代表未使用满减,1代表使用满减),isNormal:0 (0标准，1非标准规格),shopId:'',
     *      *      *             yun:id(传入套餐id),yunPrice:10(套餐单价),yunNum:8(套餐亩数),detail:{['id':'商品id','dose':'规格','name':'商品名称']}],
     *             }
     *
     *             }
     *
     * @return
     * @throws Exception
     */
    @GetMapping("wechatPay")
    public Map<String, String> wechatPay(@RequestParam(value = "userId") String userId,
                                         @RequestParam(value = "totalFee") String totalFee,
                                         @RequestParam(value = "body") String body, @RequestParam(value = "description") String description
    ) throws Exception {
        //请求预支付订单
        return  wechatService.dounifiedOrder(userId, totalFee,body,description);

    }

    /**
     * 微信支付回调
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value = "notify.json", method = {RequestMethod.GET, RequestMethod.POST})
    public String wxPayNotify(HttpServletRequest request, HttpServletResponse response) {
        return  wechatService.payBack(request,response);
    }

    /**
     * 订单查询
     * @param outTradeNo 订单号
     * @return
     */
//    @GetMapping("orderQuery")
//    public Map<String, String> orderQuery(@RequestParam(value = "outTradeNo") String outTradeNo){
//        return wechatService.orderQuery(outTradeNo);
//    }

    /**
     * 此种情况是微信支付成功，但是多次回调的时候都没有成功，需要再处理
     * @param orderIndexId  一级订单id
     * @return
     */
//    @GetMapping("orderSuccess")
//    public ResultBean orderSuccess(String orderIndexId){
//        return wechatService.orderSuccess(orderIndexId);
//    }


    //----------------------------------------------培训页面接口--------------------------------------------------------

    /**
     * 分页查询所有培训
     * @param antdPage
     * @param model
     * @return
     */
    @GetMapping(value = "queryTrainByPage")
    public ResultBean queryTrainByPage(AntdPage antdPage, CjTrain model){
        return cjTrainService.queryTrainByPage(antdPage, model);
    }

    /**
     * 云学院报名接口
     * @param trainId   培训id
     * @return 返回是否报名成功
     */
    @GetMapping("submitTrain")
    public ResultBean submitTrain(String trainId){
        return appService.submitTrain(trainId);
    }

    /**
     * 取消培训报名
     * @param id
     * @return
     */
    @GetMapping("deleteTrainDetail")
    public ResultBean deleteTrainDetail(String id){
        return cjTrainDetailService.deleteTrainDetail(id);
    }

    /**
     * 根据当前登录人查询已报名的培训项目
     * @return
     */
    @GetMapping("queryTrainDetailEmployee")
    public ResultBean queryTrainDetailEmployee(){
        return cjTrainDetailService.queryTrainDetailEmployee();
    }



//------------------------------------------------------特质订单接口----------------------------------------------------


    /**
     * 发布特质订单接口
     * @param   model 农作物类型     cropType
     * @param   model 亩数        number
     * @param   model 药剂类型      medicineType
     * @param   model 价格        money
     * @param   model 作业时间      beginTime
     * @param   model 预计周期 （天）  cycleTime
     * @param   model 集合地址      address
     * @param   model 订单备注      remark
     * @param   model 省         province
     * @param   model 市         city
     * @param   model 县/区       county
     * @param   model 联系人   customerName（不用传）
     * @param   model 联系人id   customerId（不用传）
     * @param   model 联系人电话     cellphone（不用传）
     * @param   model 发布押金（先不做）
     * @param   model 发布人的经度坐标      xx
     * @param   model 发布人的纬度坐标      yy
     * @return 返回是否成功发布
     */
    @PostMapping("addRobotTask")
    public ResultBean addRobotTask(@RequestBody CjRobotTask model){
        return appService.addRobotTask(model);
    }

    /**
     * 查询未接单的特质订单
     * @return
     */
    @GetMapping("queryRobotTask")
    public ResultBean queryRobotTask(AntdPage antdPage){
        return appService.queryRobotTask(antdPage);
    }

    /**
     * 机手在抢单大厅接单
     * @param id    特质订单id
     * @return
     */
    @GetMapping("robotTaskFinish")
    public ResultBean robotTaskFinish(String id){
        return appService.robotTaskFinish(id);
    }



//---------------------------------------------任务页面接口-------------------------------------------------------------


    /**
     * 机手在任务列表接单，用于云飞防
     * @param id    任务表id
     * @return
     */
    @GetMapping("robotTaskAccept")
    public ResultBean robotTaskAccept(String id){
        return appService.robotTaskAccept(id);
    }


    /**
     * 机手在作业结束之后确认任务
     * 此时有两种情况，一种是特使订单（不做处理），一种是云飞防订单（需要处理）
     * 机手自己的积分+1
     * @param id    任务id
     * @return
     */
    @GetMapping("robotTaskConfirm")
    public ResultBean robotTaskConfirm(String id){
        return cjTaskService.robotTaskConfirm(id);
    }

    /**
     * 分页查询任务列表
     * @param antdPage
     * @param model
     * @return
     */
    @GetMapping("queryTaskByPage")
    public ResultBean queryTaskByPage(AntdPage antdPage, CjTask model){
        return cjTaskService.queryTaskByPage(antdPage, model);
    }

    /**
     * 查询购物车生成的订单列表
//     * @param 用户id
     * @param   flag 订单状态  1:未完成   2：已完成
     * @return 订单的集合对象
     */
//    @GetMapping("selectOrder")
//    public ResultBean selectOrder(String flag){
//        return appService.selectOrder(flag);
//    }



    //----------------------------------------订单页面接口--------------------------------------------------------------



    /**
     * 订单表查询     只限于未支付的和取消的
     * @param model payStatus=0 未支付的 int类型
     *              payStatus=3 取消的 int类型
     *
     * @param antdPage
     * @return
     */
    @GetMapping("queryOrderIndexByPage")
    public ResultBean queryOrderIndexByPage(CjOrderIndex model, AntdPage antdPage){
        return cjOrderIndexService.queryOrderIndexByPage(model, antdPage);
    }

    /**
     * 订单表查询
     * @param model  payStatus=1 已支付待实施的    int类型
     *               payStatus=4：待评价页面（包含待评价和已评价）  int类型
     *               flags=1：退款页面   int类型
     *               payStatus=5：已评价页面  int类型
     *
     *
     * @param antdPage
     * @return
     */
    @GetMapping("queryOrderSpecialByPage")
    public ResultBean queryOrderSpecialByPage(CjOrderIndex model,AntdPage antdPage){
        return cjOrderService.queryOrderSpecialByPage(model, antdPage);
    }
    /**
     * 客户在机手作业之后确认任务
     * @param id    二级订单表id
     * @return
     */
    @GetMapping("customerTaskConfirm")
    public ResultBean customerTaskConfirm(String id){
        return cjTaskService.customerTaskConfirm(id);
    }


    /**
     * 新增商品评价
     * @param model commodityId：商品id    orderId：订单id    star：星级     content：评价内容
     * @return
     */
    @GetMapping("addEvaluation")
    public ResultBean addEvaluation(CjEvaluation model){
        return cjEvaluationService.addEvaluation(model);
    }

    /**
     * 申请退款申请
     * @param id    二级订单表id
     * @return
     */
    @GetMapping("refundOrder")
    public ResultBean refundOrder(String id){
        return cjOrderService.refundOrder(id);
    }





    /**
     * 个人钱包
     * @return
     */
    @GetMapping("personWallet")
    public ResultBean personWallet(){
        return appService.personWallet();
    }

    /**
     * 上传文件
     * @param files
     * @return
     */
    @PostMapping("uploadFile")
    public ResultBean uploadFile(@RequestParam(value = "files",required = false) MultipartFile[] files){
        return fileService.uploadFile(files);
    }

    /**
     * 首页推荐商品展示
     * @param antdPage 一次查询条数 默认为10 第几页  默认为1
     * @param
     * @return 返回resultBean List  商品缩略图，商品简述，商品售价
     */
    @GetMapping(value= "queryRecommendByPage")
    public ResultBean queryRecommendByPage(AntdPage antdPage){
        return cjCommodityYunService.queryRecommendByPage(antdPage);
    }
    /**
     * 下单之前的校验
     * @return
     */
    @GetMapping("placeAnOrder")
    public ResultBean placeAnOrder(){
        return appService.placeAnOrder();
    }

    /**
     * 机手扫描二维码显示内容
     * @param id
     * @return
     */
    @GetMapping("qrData")
    public ResultBean qrData(String id){
        return cjOrderService.qrData(id);
    }

    /**
     * 机手扫描二维码之后领取任务
     * @param id    任务id
     * @return
     */
    @GetMapping("robotTask")
    public ResultBean robotTask(String id){
        return cjOrderService.robotTask(id);
    }

    /**
     * 地图算距离拿零售商
     * @param xx    经度
     * @param yy    维度
     * @param size  缩放比例等级，百度的有19级
     * @return
     */
    @GetMapping("getMap")
    public ResultBean getMap(double xx,double yy,Integer size){
        return appService.getMap(xx, yy, size);
    }

}
